# -*-coding: Utf-8 -*-
# @File : student_interface .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time：2023/6/12

'''
学生接口层
'''
from db import models
from interface import common_interface
from conf import settings

logger_student = settings.get_logger('student')

# 学生接口层面的注册接口
def student_register_interface(username_student, encrypted_password_after, salt):
    # （1）判断用户是否存在
    # 调用Student类中的select方法
    # 由select方法调用数据库中的select_data 功能
    student_obj = models.Student.select(username_student)
    # （1.1）如果用户存在，反馈状态码及信息给视图层
    if student_obj:
        flow = f'当前学生{username_student}已注册!请确认信息!'
        logger_student.warning(flow)
        return False, flow
    # （1.2）如果用户不存在，则进行注册并反馈状态码给视图层

    # 实例化学生类对象
    student_obj = models.Student(username_student, encrypted_password_after, salt)
    # 调用学生类中的保存数据方法（父类）
    student_obj.save()

    flow = f'当前学生{username_student},注册成功!!!'
    logger_student.info(flow)
    return True, flow


# 学生接口层层面的登录接口
def student_login_interface(username_student, password_student, login_code, login_code_input):
    flag, msg = common_interface.login_interface_roles(
        username=username_student,
        password=password_student,
        login_random_code=login_code,
        login_input_code=login_code_input,
        roles='student')
    if flag:
        logger_student.info(msg)
    else:
        logger_student.warning(msg)
    return flag, msg


# 学生接口获取已经选择的校区
def student_get_school_name(login_student_name):
    # （1）获取学生对象
    student_obj = models.Student.select(login_student_name)
    # （1.1）获取学生对象中的学校属性
    school_name = student_obj.school_name
    # （1.2）未入学
    if not school_name:
        flow = f'当前学生:>>>{login_student_name}  :>>>未入学'
        logger_student.warning(flow)
        return school_name, flow

    # (1.3)已入学
    flow = f'当前学生:>>>{login_student_name}   :>>>已入学{school_name}成功!!'
    logger_student.info(flow)
    return school_name, flow


# 学生接口选择学校
def choose_school_interface(login_student_name, school_name):
    # （1）调用接口实例化学生对象
    student_obj = models.Student.select(login_student_name)
    # （2）判断学生是否存在学校
    if student_obj.school_name:
        flow = f'当前学生{login_student_name}已有学校在读,不允许复选新校区!!'
        logger_student.warning(flow)
        return False, flow
    # （3）若果学生没有选择学校，则调用学生对象中的选择学校方法进行添加学校
    student_obj.choose_school(school_name)

    flow = f'恭喜:>>>>{login_student_name}    入学:>>>>{school_name}成功!!'
    logger_student.info(flow)
    return True, flow


# 获取学生所在学校所有课程接口
def get_course_list_interface(login_student_name, login_student_school_name):
    # # （1）获取当前学生对象
    # student_obj = models.Student.select(login_student_name)

    # (2)判断学生是否已有学校
    # （2.1）如果学生没有选择校区，则返回false
    if not login_student_school_name:
        flow = f'当前学生{login_student_name} 未入学! 请先入学!'
        logger_student.warning(flow)
        return False, flow

    # （2.2）如果学生选择了校区，则继续进行选课
    school_obj = models.School.select(login_student_school_name)
    courses_list = school_obj.courses_list

    # （2.3）判断当前学校是否有课程设置，如果没有需要先添加课程
    if not courses_list:
        flow = f'无课程选择，请联系管理员创建后再选择!!'
        logger_student.warning(flow)
        return False, flow
    # (2.4)如果存在课程列表则返回课程列表
    return True, courses_list


# 学生选择课程接口
def student_choose_course_interface(login_student_name, course_name):
    # (1)判断当前课程是否存在于学生的课程列表内
    student_obj = models.Student.select(login_student_name)
    student_course_list = student_obj.course_lists

    # (1.1)存在课程
    if course_name in student_course_list:
        flow = f'当前课程:>>>{course_name} 已经存在,无法复选!!'
        logger_student.warning(flow)
        return False, flow

    # (2)课程不存在则调用添加学生对象中的课程方法进行添加
    student_obj.choose_course(course_name)

    flow = f'添加课程:>>>{course_name}成功!!'
    logger_student.info(flow)
    return True, flow


# 获取学生课程列表
def student_select_course_list(login_student_name):
    # （1）获取学生对象
    student_obj = models.Student.select(login_student_name)

    # (1.1) 获取已选择的课程列表
    course_list = student_obj.course_lists

    if not course_list:
        flow = f'当前学生:>>>{login_student_name}  课程列表为空,请先选择课程!!'
        logger_student.warning(flow)
        return False, flow

    return True, course_list


# 获取课程详细信息接口
def student_get_course_details(course_name):
    # （1）实例化课程类对象
    course_obj = models.Courses.select(course_name)

    # (2) 读取课程详细信息
    course_name = course_obj.username
    course_timestamp = course_obj.course_timestamp
    course_price = course_obj.course_price
    return course_name, course_timestamp, course_price


# 查看当前课程是否付费
def student_check_course_payed_interface(login_student_name, course_name):
    # （1）实例化学生对象
    student_obj = models.Student.select(login_student_name)

    # （2） 查看当当前课程付费列表
    # # {'course_name1': False,'course_name2': True}
    course_payed = student_obj.payed_dict

    # 返回课程名字对应的状态 true / false
    if course_payed[course_name]:
        flow = f'已付费'
        return True, flow
    flow = f'未付费'
    return False, flow


# 学生付费课程接口
def student_pay_for_course(login_student_name, flag, course_name, course_price, payed_money):
    # （1）实例化学生对象
    student_obj = models.Student.select(login_student_name)
    # 进行付费操作判断
    # 未付费课程进行付费
    # 金额不正确
    if int(course_price) != payed_money:
        flow = f'金额不匹配,请确认输入的金额!!'
        logger_student.warning(flow)
        return False, flow

    # 金额正确
    student_obj.payed_course(course_name)

    # 反馈提示语
    flow = f'当前课程:>>>{course_name}激活成功!!'
    logger_student.info(flow)
    return True, flow


def student_check_score_interface(login_student_name):
    # 实例化学生对象
    student_obj = models.Student.select(login_student_name)

    # 获取分数列表
    score_dict = student_obj.score_dict

    if not score_dict:
        flow = f'当前分数列表为空,请先选择课程!'
        logger_student.warning(flow)
        return False, flow

    return True, score_dict


# 查看学生全部信息接口
def student_check_student_details_interface(login_student_name):
    # （1） 实例化学生对象
    student_obj = models.Student.select(login_student_name)
    # 学生姓名
    # 学生选择的校区
    # 学生选择的课程列表
    course_list = student_obj.course_lists
    # 学生的课程分数字典
    score_dict = student_obj.score_dict
    # 学生的课程付费情况
    msg_payed = student_obj.payed_dict
    return course_list, score_dict, msg_payed
